/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package DAO;

import bean.Artigo;
import bean.Autor;
import bean.Instituicao;
import bean.Obra;
import bean.Periodico;
import bean.Tema;
import java.io.Serializable;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author fernando
 */
public class ArtigoDao implements Serializable{

    private Conexao conexao;
    private PreparedStatement ps;
    private boolean sucess = false;

    public ArtigoDao() {
        this.conexao = new ConexaoPostgres();

    }

    public boolean cadastrarArtigo(Artigo artigo) {
        sucess = false;

        try {
            System.out.println("cadastro Artigo: " + artigo.getTitulo());
            ps = conexao.getConnection().prepareStatement("INSERT INTO Obra(titulo, pagina_inicio, pagina_fim, periodico, tipo, ano) VALUES (?, ?, ?, ?, 'Artigo', ?) ");
            ps.setString(1, artigo.getTitulo());
            ps.setInt(2, artigo.getPaginaInicio());
            ps.setInt(3, artigo.getPaginaFim());
            ps.setInt(4, artigo.getPeriodicoAnal().getId());
            ps.setInt(5, artigo.getPeriodicoAnal().getAnoPublicacao());
            ps.executeUpdate();
            artigo.setId(this.buscarIdArtigo(artigo));

            Iterator i = artigo.getAutores().iterator();
            Autor a = new Autor();
            int posicao = 1;
            while (i.hasNext()) {
                
                ps = conexao.getConnection().prepareStatement("INSERT INTO obra_autor(id_obra, id_autor, posicao) VALUES (?, ?, ?)  ");
                ps.setInt(1, artigo.getId());
                Autor autor = (Autor) i.next();
                ps.setInt(2, autor.getId());
                ps.setInt(3, posicao);
                ps.executeUpdate();
                conexao.closeConnection();
                posicao++;
            }

            i = artigo.getTemas().iterator();
            Tema tema = new Tema();
            while (i.hasNext()) {
                ps = conexao.getConnection().prepareStatement("INSERT INTO obra_tema(id_obra, id_tema) VALUES (?, ?)  ");
                ps.setInt(1, artigo.getId());
                tema = (Tema) i.next();
                ps.setInt(2, tema.getId());
                ps.executeUpdate();
                conexao.closeConnection();

            }


            sucess = true;
        } catch (SQLException ex) {
            Logger.getLogger(InstituicaoDao.class.getName()).log(Level.SEVERE, null, ex);
            conexao.closeConnection();
            return sucess;
        }

        conexao.closeConnection();
        return sucess;
    }

    public boolean alterarArtigo(Artigo artigo) {
        sucess = false;

        

        try {
            System.out.println("Dao - Alterar Artigo: ");
            System.out.println("ID: " + artigo.getId());
            System.out.println("Titulo: " + artigo.getTitulo());
            System.out.println("Periódico ou Anais: "+ artigo.getPeriodicoAnal().getId()  + artigo.getPeriodicoAnal().getTitulo());


            ps = conexao.getConnection().prepareStatement("UPDATE Obra SET titulo = ? , pagina_inicio = ? , pagina_fim = ?, periodico = ?, ano = ? WHERE id = ?");
            ps.setString(1, artigo.getTitulo());
            ps.setInt(2, artigo.getPaginaInicio());
            ps.setInt(3, artigo.getPaginaFim());
            ps.setInt(4, artigo.getPeriodicoAnal().getId());
            ps.setInt(5, artigo.getPeriodicoAnal().getAnoPublicacao());
            ps.setInt(6, artigo.getId());
            ps.executeUpdate();


            //Remove Todos os elementos para inserir o que se alterar
            ps = conexao.getConnection().prepareStatement(" DELETE FROM obra_autor WHERE id_obra = ?");
            ps.setLong(1, (artigo.getId()));
            ps.executeUpdate();

            Iterator i;
            i = artigo.getAutores().iterator();
            int posicao = 1;
            while (i.hasNext()) {
                ps = conexao.getConnection().prepareStatement("INSERT INTO obra_autor(id_obra, id_autor, posicao) VALUES (?, ?, ?)  ");
                ps.setInt(1, artigo.getId());
                Autor autor = (Autor) i.next();
                ps.setInt(2, autor.getId());
                ps.setInt(3, posicao);
                ps.executeUpdate();
                conexao.closeConnection();
                posicao++;

            }

            ps = conexao.getConnection().prepareStatement(" DELETE FROM obra_tema WHERE id_obra = ?");
            ps.setLong(1, (artigo.getId()));
            ps.executeUpdate();

            i = artigo.getTemas().iterator();
            while (i.hasNext()) {
                ps = conexao.getConnection().prepareStatement("INSERT INTO obra_tema(id_obra, id_tema) VALUES (?, ?)  ");
                ps.setInt(1, artigo.getId());
                Tema tema = (Tema) i.next();
                ps.setInt(2, tema.getId());
                ps.executeUpdate();
                conexao.closeConnection();
                        
            }


        } catch (SQLException ex) {
            System.out.println("Erro no Método de edição de artigo ");
            conexao.closeConnection();
            Logger.getLogger(InstituicaoDao.class.getName()).log(Level.SEVERE, null, ex);
            return sucess;
        }

        conexao.closeConnection();
        sucess = true;
        return sucess;
    }

    public boolean removerArtigo(Artigo artigo) {
        sucess = false;
        try {


            ps = conexao.getConnection().prepareStatement(" DELETE FROM obra_autor WHERE id_obra = ?");
            ps.setLong(1, (artigo.getId()));
            ps.executeUpdate();
            conexao.closeConnection();

            ps = conexao.getConnection().prepareStatement(" DELETE FROM obra_tema WHERE id_obra = ?");
            ps.setLong(1, (artigo.getId()));
            ps.executeUpdate();
            conexao.closeConnection();

            ps = conexao.getConnection().prepareStatement(" DELETE FROM obra WHERE id = ?");
            ps.setLong(1, (artigo.getId()));
            ps.executeUpdate();
            conexao.closeConnection();

            sucess = true;
        } catch (SQLException ex) {
            ex.printStackTrace();
            conexao.closeConnection();
            return sucess;
        }

        conexao.closeConnection();
        return sucess;
    }

    public List<Artigo> listarArtigos() {
        List<Artigo> artigos = new ArrayList<Artigo>();
        try {
            System.out.println("Fui Executado: Artigo Dao  - listarArtigos");
            ps = conexao.getConnection().prepareStatement("SELECT id, pagina_inicio, pagina_fim, periodico, titulo, tipo, ano "
                    + "FROM obra WHERE tipo = 'Artigo' ");
            ResultSet rs = ps.executeQuery();
            conexao.closeConnection();
            Artigo artigo = new Artigo();
            Obra pa = new Obra();
            ObraDao od = new ObraDao();
            Iterator i;

            while (rs.next()) {
                artigo.setId(rs.getInt("id"));
                artigo.setTitulo(rs.getString("titulo"));
                artigo.setPaginaInicio(rs.getInt("pagina_inicio"));
                artigo.setPaginaFim(rs.getInt("pagina_fim"));
                artigo.setTipo(rs.getString("tipo"));
                
                
                
                pa.setId(rs.getInt("periodico"));
                pa = od.consultaObra(pa.getId());
                artigo.setPeriodicoAnal(pa);
                artigo.setAnoPublicacao(rs.getInt("ano"));
                artigo.setAutores((ArrayList) this.buscarAutoresLivro(artigo));
                artigo.setTemas((ArrayList) this.buscarTemasLivro(artigo));
                artigos.add(artigo);
                
                artigo = new Artigo();


            }


        } catch (SQLException ex) {
            this.conexao.closeConnection();
            Logger.getLogger(InstituicaoDao.class.getName()).log(Level.SEVERE, null, ex);
        }finally{
            this.conexao.closeConnection();
        }
        return artigos;
    }

    public ArrayList<Tema> buscarTemasLivro(Artigo artigo) {
        ArrayList<Tema> temasObra = new ArrayList<Tema>();
        try {
            ps = conexao.getConnection().prepareStatement("SELECT t.id, t.tema FROM tema AS t, obra_tema AS ot, obra AS o "
                    + "WHERE o.id = ? AND o.id = ot.id_obra AND t.id = ot.id_tema;    ");
            ps.setInt(1, artigo.getId());
            ResultSet rs = ps.executeQuery();
            conexao.closeConnection();
            Tema t = new Tema();
            while (rs.next()) {

                t.setId(rs.getInt("id"));
                t.setTema(rs.getString("tema"));


                temasObra.add(t);

                t = new Tema();

            }

        } catch (SQLException ex) {
            this.conexao.closeConnection();
            Logger.getLogger(LivroDao.class.getName()).log(Level.SEVERE, null, ex);
        }

        this.conexao.closeConnection();
        return temasObra;
    }

    public int buscarIdArtigo(Artigo a) {
        try {
            ps = conexao.getConnection().prepareStatement("Select id from obra where titulo = ? AND pagina_inicio = ? AND pagina_fim = ? AND periodico = ? AND tipo = ?; ");
            ps.setString(1, a.getTitulo());
            ps.setInt(2, a.getPaginaInicio());
            ps.setInt(3, a.getPaginaFim());
            ps.setInt(4, a.getPeriodicoAnal().getId());
            ps.setString(5, "Artigo");

            ResultSet rs = ps.executeQuery();
            conexao.closeConnection();
                    
            while (rs.next()) {
                a.setId(rs.getInt("id"));
                System.out.println("Id do Artigo: " + a.getId());
            }
        } catch (SQLException ex) {
            Logger.getLogger(ArtigoDao.class.getName()).log(Level.SEVERE, null, ex);
            conexao.closeConnection();
        }
        conexao.closeConnection();
        return a.getId();
    }

    public List<Autor> buscarAutoresLivro(Artigo artigo) {
        ArrayList<Autor> autoresObra = new ArrayList<Autor>();
        try {
            ps = conexao.getConnection().prepareStatement("SELECT a.id, a.restante_nome, a.ultimo_nome, a.id_instituicao, i.nome, i.estado, i.municipio, a.lattes "
                    + "FROM autor AS a, instituicao AS i, obra_autor AS oa, obra AS o "
                    + "WHERE o.id = ? AND o.id = oa.id_obra AND a.id = oa.id_autor AND a.id_instituicao = i.id Order By posicao ");
            ps.setInt(1, artigo.getId());
            ResultSet rs = ps.executeQuery();
            conexao.closeConnection();
            Instituicao i = new Instituicao();
            Autor a = new Autor();
            while (rs.next()) {

                a.setId(rs.getInt("id"));
                a.setRestanteNome(rs.getString("restante_nome"));
                a.setUltimoNome(rs.getString("ultimo_nome"));
                a.setLattes(rs.getString("lattes"));
                i.setId(rs.getInt("id_instituicao"));
                i.setNome(rs.getString("nome"));
                i.setEstado(rs.getString("estado"));
                i.setMunicipio(rs.getString("municipio"));
                a.setInstituicaoAutor(i);

                autoresObra.add(a);

                a = new Autor();
                i = new Instituicao();
            }

        } catch (SQLException ex) {
            this.conexao.closeConnection();
            Logger.getLogger(LivroDao.class.getName()).log(Level.SEVERE, null, ex);
        }
        finally{
            conexao.closeConnection();
        }
        
        return autoresObra;

    }
    
    public Artigo buscarArtigos(int id) {
        Artigo artigo = new Artigo();
        try {
            
            ps = conexao.getConnection().prepareStatement("SELECT id, pagina_inicio, pagina_fim, periodico, titulo, tipo "
                    + "FROM obra WHERE id = ? ");
            ps.setInt(1, id);
            ResultSet rs = ps.executeQuery();
            conexao.closeConnection();
           
            Obra pa = new Obra();
            ObraDao od = new ObraDao();
            Iterator i;

            if (rs.next()) {
                artigo.setId(rs.getInt("id"));
                artigo.setTitulo(rs.getString("titulo"));
                artigo.setPaginaInicio(rs.getInt("pagina_inicio"));
                artigo.setPaginaFim(rs.getInt("pagina_fim"));
                artigo.setTipo(rs.getString("tipo"));
                
                
                
                pa.setId(rs.getInt("periodico"));
                pa = od.consultaObra(pa.getId());
                artigo.setPeriodicoAnal(pa);

                artigo.setAutores((ArrayList) this.buscarAutoresLivro(artigo));
                artigo.setTemas((ArrayList) this.buscarTemasLivro(artigo));
        
            
            }


        } catch (SQLException ex) {
            this.conexao.closeConnection();
            Logger.getLogger(InstituicaoDao.class.getName()).log(Level.SEVERE, null, ex);
        }finally{
            this.conexao.closeConnection();
        }
        return artigo;
    }
    
}
